/*
 * Copyright @ 苏州瑞云信息技术有限公司 All rights reserved.
 */
package work.base.data.list;

import cn.hutool.core.collection.CollUtil;
import work.entity.Student;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 *
 * list实现排序的几种方法
 *
 * 注意
 *      1 按照指定的顺序进行排序, 需要先使用一个 List存储指定的顺序, 比如 "响应", "解决", "验证", "交付"
 *        再使用 List.indexOf()进行排序
 *        比如 Comparator.comparingInt(orderedList::indexOf)
 *
 */
public class ListSortTest {

    public static void main(String[] args) {
        ListSortTest sortTest = new ListSortTest();
        sortTest.listSort1();
    }

    /**
     * 排序
     *
     * 使用方法
     *      1 list的sort() 方法用于实现排序 参数是Comparator接口
     *        Comparator接口的compare()方法  k1-k2 是升序 k2-k1为降序
     *        int num = k1-k2
     *        num > 0 ? 1 : -1 顺序不变  num > 0 ? -1 : 1 交换顺序
     *      2 Comparator接口的 reversed()方法实现反序
     *
     */
    public void listSort() {
        List<Student> studentList = this.getStudentList();
        studentList.sort(
                (k1, k2) -> {
                    Integer num = k1.getIndex() - k2.getIndex();
                    System.out.println(num);
                    return num > 0 ? -100 : 40;
                }
        );
        studentList.forEach(System.out::println);
    }

    /**
     * 按照指定的顺序进行排序
     */
    public void listSort1() {
        List<Student> studentList = this.getStudentList();
        List<String> orderList = Stream.of("王五", "杨六", "张三", "李四").collect(Collectors.toList());
        studentList.sort(
                (k1, k2) -> {
                    int order = orderList.indexOf(k1.getName()) - orderList.indexOf(k2.getName());
                    return order > 0 ? 1 : -1;
                }
        );
        studentList.forEach(System.out::println);
    }


    /**
     * 使用 stream流进行排序 会生成一个新的 List对象
     */
    public void streamSort() {
        List<Student> studentList = this.getStudentList();
        List<Student> newList = studentList.stream()
                .sorted(Comparator.comparing(Student::getIndex).reversed()).collect(Collectors.toList());
        newList.forEach(System.out::println);
    }

    /**
     * 使用hutool的工具类进行排序
     */
    public void collUtilSort() {
        List<Student> studentList = this.getStudentList();
        CollUtil.sort(studentList, Comparator.comparingInt(Student::getIndex).reversed());
        studentList.forEach(System.out::println);
    }

    /**
     * 使用Collections工具类实现排序
     */
    public void collectionsSort() {
        List<Student> studentList = this.getStudentList();
        Collections.sort(studentList, (k1, k2) -> {
            Integer num = k1.getIndex() - k2.getIndex();
            System.out.println(num);
            return num > 0 ? -100 : 40;
        });
        studentList.forEach(System.out::println);
    }


    /**
     * 原始数据列表
     *
     * @return
     */
    public List<Student> getStudentList() {
        List<Student> studentList = new LinkedList<>();
        studentList.add(new Student("李四", 23));
        studentList.add(new Student("张三", 12));
        studentList.add(new Student("王五", 45));
        studentList.add(new Student("杨六", 45));
        return studentList;
    }
}
